package removeduplicateds_uppercasingfirstletter;

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class RemoveDuplicateds_UppercasingFirstLetter {
    public static void main(String[] args) throws IOException {
        //去重：用=分割，比较0号位是否相似，如果相似就去掉此行内容
        //首字母大写：用=分割，获取1号位，再用空格分隔，获取每位首字母并大写，注意获取的0号位一定大写，如果其余位置上是字母少于5个的介词和连词则小写
        //需要小写的字母主要有a, an, and, as, as if, as long as, at, but, by, even if, for, from, if, if only, in, into, like, near, now that, nor, of, off, on, on top of, once, onto, or, out of, over, past, so, so that, than, that, the, till, to, up, upon, with, when, yet
        //需要自己把多余回车去掉

        //创建字符串类型的集合，用来接收全部内容，键值对任一不重复的内容，键相同值不相同的内容（这部分从前一部分中挑出），这些之后全部英文翻译首字母大写放入对应a
        List<String> list = new ArrayList();
        List<String> newlist1;
        List<String> newlist2 = new ArrayList();
        List<String> newlist2a = new ArrayList();//对应a
        List<String> newlist3 = new ArrayList();
        List<String> newlist3a = new ArrayList();//对应a

        //读取源文档
        BufferedReader br = new BufferedReader(new FileReader(".\\环控器翻译文档（旧）.txt"));
        String line;
        while ((line = br.readLine()) != null) {
            list.add(line);
        }
        br.close();

        //去重，有一点不同就保留，并非根据键值对的键来去重，键和值都相同才会去重
        newlist1 = removeDuplicate(list);
        //集合转数组
        String[] arr = new String[newlist1.size()];
        newlist1.toArray(arr);
        Arrays.sort(arr);//数组排序
        //找到主键相同但翻译不同的单独挑出来放到一个文档里
        for (int i = 0; i < arr.length; i++) {
            String[] split = arr[i].split("=");
            if (Arrays.stream(split).count() >= 2) {//保证有等于号的情况下左右都有值
                for (int i1 = 0; i1 < arr.length; i1++) {
                    String[] split2 = arr[i1].split("=");
                    if (Arrays.stream(split2).count() >= 2) {//保证有等于号的情况下左右都有值
                        if (i != i1 && split[0].equals(split2[0])) {//如果是数组里不同位置的内容主键相同，则挑出这两个到新集合newlist3里
                            newlist3.add(arr[i]);
                            newlist3.add(arr[i1]);
                            arr[i] = String.valueOf(0);
                            arr[i1] = String.valueOf(0);
                        }
                    }
                }
            }else {
                if (!arr[i].equals(String.valueOf(0))) {
                    newlist3a.add(arr[i]);
                }
            }
            if (!arr[i].equals(String.valueOf(0))) {
                newlist2.add(arr[i]);
            }
        }

        //首字母大写
        //按照等于号、空格进行切割
        for (String s : newlist2) {
            String[] split2 = s.split("=");
            if (Arrays.stream(split2).count() >= 2) {//保证有等于号的情况下左右都有值
                String[] split3 = split2[1].split("\\s+");//以空格分隔
                if (Arrays.stream(split3).count() >= 2) {//空格分隔后有至少两个值
                    split3[0] = captureName(split3[0]);//0号位肯定大写
                    String s3 = split2[0] + "=" + split3[0];
                    for (int i = 1; i < split3.length; i++) {//1号位往后根据情况大写
                        //排除一些需要小写的介词、连词、冠词、感叹词
                        if (split3[i].equals("a") || split3[i].equals("an") || split3[i].equals("the") || split3[i].equals("of") || split3[i].equals("to") || split3[i].equals("and") || split3[i].equals("upper") || split3[i].equals("than")) {
                            s3 = s3 + " " + split3[i];
                        } else {
                            s3 = s3 + " " + captureName(split3[i]);
                        }
                    }
                    newlist2a.add(s3);
                } else {
                    split2[1] = captureName(split2[1]);
                    String s2 = split2[0] + "=" + split2[1];
                    newlist2a.add(s2);
                }
            }
        }
        for (String s : newlist3) {
            String[] split2 = s.split("=");
            if (Arrays.stream(split2).count() >= 2) {//保证有等于号的情况下左右都有值
                String[] split3 = split2[1].split("\\s+");//以空格分隔
                if (Arrays.stream(split3).count() >= 2) {//空格分隔后有至少两个值
                    split3[0] = captureName(split3[0]);//0号位肯定大写
                    String s3 = split2[0] + "=" + split3[0];
                    for (int i = 1; i < split3.length; i++) {//1号位往后根据情况大写
                        //排除一些需要小写的介词、连词、冠词、感叹词
                        if (split3[i].equals("a") || split3[i].equals("an") || split3[i].equals("the") || split3[i].equals("of") || split3[i].equals("to") || split3[i].equals("and") || split3[i].equals("upper") || split3[i].equals("than")) {
                            s3 = s3 + " " + split3[i];
                        } else {
                            s3 = s3 + " " + captureName(split3[i]);
                        }
                    }
                    newlist3a.add(s3);
                } else {
                    split2[1] = captureName(split2[1]);
                    String s2 = split2[0] + "=" + split2[1];
                    newlist3a.add(s2);
                }
            }
        }

        //写出不包含重复的部分到新文档（主键相同的会挑到重复部分）
        BufferedWriter bw = new BufferedWriter(new FileWriter(".\\环控器翻译文档（新）.txt"));
        for (String s : newlist2a) {
            bw.write(s + "\r\n");
            bw.flush();
        }
        //释放资源
        bw.close();

        //写出主键相同内容不同的重复部分到重复部分文档，手动筛选后全部粘贴到新文档即可
        BufferedWriter bw2 = new BufferedWriter(new FileWriter(".\\环控器翻译重复部分.txt"));
        for (String s : newlist3a) {
            bw2.write(s + "\r\n");
            bw2.flush();
        }
        //释放资源
        bw2.close();
    }

    //去重https://www.cnblogs.com/zhaoyan001/p/11737961.html
    public static List removeDuplicate(List list) {
        List listTemp = new ArrayList();
        for (int i = 0; i < list.size(); i++) {
            if (!listTemp.contains(list.get(i))) {
                listTemp.add(list.get(i));
            }
        }
        return listTemp;
    }

    //首字母大写
    public static String captureName(String name) {
        name = name.substring(0, 1).toUpperCase() + name.substring(1);
        return name;
//        用ASCII码的方式不太对
//        char[] cs=name.toCharArray();
//        cs[0]-=32;
//        return String.valueOf(cs);
    }
}
